![Stable Diffusionで画像を作成してモデルの性能が上がるか試してみた](https://devio2023-media.developers.io/wp-content/uploads/2023/06/AzureEyeCatch.png)
Stable Diffusionで画像を作成してモデルの性能が上がるか試してみた
はじめに
新規事業部の田村です。
前回のブログ(https://dev.classmethod.jp/articles/azure-cognitive-serch-cognitive-services-image-tagging/)にて、Azure Cognitive Servicesでデータ数5枚でイメージタグを学習させてみた結果、イメージタグの分類はできたましたが、Probabilityが低いという結果が出ました。
この結果は、学習させたデータ数が5枚であったため、学習不足であると考えています。
それならば、学習させるデータ数を増やせばこの問題は解決するという見通しを立て、今回再チャレンジしてみました。
学習データ作成
学習させるデータをクローラーなどで集めてきてそれを学習に利用するという手段もあるのですが、著作権などの関係が煩わしいことや、そもそも画像を集めるのがめんどくさいと思ったので、Stable Diffusionでデータを作成しました。
(参考ブログ:https://dev.classmethod.jp/articles/stable-diffusion-txt2txt-img2img/)
今回生成するデータは前回と同様に、
- ジーンズ
- シューズ
- シャツ
- その他
のイメージタグに沿うような画像を生成させました。生成した画像は以下のような感じです。
ジーンズ
シューズ
シャツ
その他
これらの画像をそれぞれ200枚作り、前回のブログと同様に以下のようなアーキテクチャでイメージタグを生成させてみました。
学習時間に関しては前回は1時間でしたが、より精度が出るようにと長い時間(25時間)学習させました。
学習モデルでの結果
結果ですが、なんと前回よりも改悪しました。この画像は確かにジーンズとシューズの両方が写っているので、見た目だけでシューズなのかジーンズなのか、どちらに注目した画像であるか指摘されないとわからない、という結果なのですが、Probabilityがシューズ16%、ジーンズ12%とどちらでもないかのように画像を判定していて、200枚生成したのにも関わらず劣化しています。個人的には、シューズでもジーンズでもいいからどちらかのProbabilitが90%を超えて欲しかったです。
この結果を見た時に、仮説として生成AIで作成した画像の何か別の特徴を学習していて、その結果としてモデルの性能が劣化した、という仮説を立てました。
データを刻んで見てみる
では実際に学習過程で、別の特徴を学習しているか調査すべく学習するデータの枚数を刻んでみて、そのモデルの性能がどうなっているか確かめてみます。学習時間は1時間として、どのように劣化していくのかみていきたいと思います。条件を同じにするために学習時間はすべて25時間とします。
各画像枚数が10枚のとき
この時ジーンズとして評価されていますがそれはシューズのデータにジーンズと一緒に写っているものがないからこのように判定されています。この理由は考察の部分で検証しています。
各画像が30枚の時
10枚の時と判定結果は変化ないですが、Probabilityが一気に下がりました。
各画像が50枚の時
30枚の時と比較してちょっと劣化した、という感じですね。
あまり変化がないので、一気に画像枚数を多くしてどんどんみていきます。
各画像が120枚の時
この画像ではシューズの確率が上がっていますが、50枚の時と比べて大きな変化はありません。
各画像が170枚の時
モデルが劣化しました。今回使用したモデルとデータセットでは、170枚以上でモデルの性能が劣化するようです。
そこで先行研究を見たのですが、どうやら生成AIで生成した画像枚数が多いと生成AIならではの特徴を学習し、モデルの劣化を引き起こすという実験結果があります。
今回起きたことを考えるに、生成AIで作成した画像を学習した場合、画像の枚数が多くなると生成AIならではの特徴を学習し、モデルの性能が劣化するようです。
(参考:https://arxiv.org/pdf/2304.08466.pdf)
この原因はわかっていないのですが、原著論文では1024×1024の画像を学習させる前に画像サイズを小さくしていますので、それを真似てみます。
画像が小さくする理由は色々と理由はあるのですが、自分は以下の2点が大事かなと思います。
- 過学習
- 大きいイメージサイズの場合、学習するパラメータの数が多いので、モデルが学習データに過剰に反応し、新しいデータに対する予測性能が低下する恐れがあります。
- 計算資源の不足
- 大きな画像サイズは、学習に必要なより計算資源を求めます。計算資源が不足している場合、モデルの学習が不十分になり、学習自体がうまく進まない可能性があります。
また別件ですが、この論文によると、生成AIだけで学習させたモデルよりも、リアルデータの画像と生成AIの画像を混ぜて学習したものが最も良い精度となったとのことです。
画像サイズを変更しての結果
同じテストデータでイメージタグを作成
変えた条件はイメージサイズを256×256としただけで、他の条件(学習させたデータは200枚、学習時間25時間)は変えずにモデルを再度学習させて結果を見てみました。
そうするとモデルの劣化が見られず、Stable Diffusionならではの特徴を学習していません。
ただこの画像の場合、ジーンズとシューズの両方が写っていることと、プロンプトで作成した画像ではパンツとシューズが一緒に写っているものをシューズとタグ付けして学習させたので、今回の画像ではシューズと認識されました。
ジーンズだけ写っている写真でイメージタグを作成
ジーンズのProbabilityが90%を超えていますね。モデルがきちんと想定通りに学習しています。
前回のモデルでのイメージタグの生成と比べた時
前回のブログでのモデル(学習データ数5枚、1時間)でイメージタグを生成した時の結果が以下です。
ジーンズが一番高いと予測されていますが、Probabilityが40%と低く、モデルの精度としては微妙です。なので、Stable Diffusionで学習させることによって、モデルの性能をアップさせることができました。
1024×1024の画像で10枚だけ学習させた時
ジーンズと予測され、なんとProbabilityが98%を超えました。
この結果から、言えることは
- 大きい画像サイズでモデルを学習させる場合、10枚程度の少数の画像枚数で学習させること
- 汎化性能を高めようとして、大量の画像を学習させようとした場合、画像サイズを小さくすること
- 画像サイズは大きい方がAIの制度に貢献する
であると言えると思います。
まとめ
この結果から言えることは、Stable Diffusionで生成したデータを学習させ、モデルの性能をアップさせることは可能です。ただし画像の中に複数のイメージタグが存在する場合、学習したデータに結果は依存するので、結果が安定しないと言えると思います。この場合、どのようにプロンプトを作るか、そしてイメージタグを予測するときに複数のイメージタグが存在する場合、どのように処理するかが大事と言えると思います。